from app.config.settings import settings  # 初始化并覆盖 使用组件环境变量配置
from app.utils.logger import setup_logging, get_logger as app_get_logger, _logger_manager
import logging
import os
import sys
from pathlib import Path

# 添加项目根目录到 Python 路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))


class BaseTestCase:
    """测试基类，提供通用的测试设置和工具方法"""

    def __init__(self):
        self.log_files = [
            "../logs/app.log",
            "../logs/system.log",
            "../logs/error.log",
            "../logs/logger_init.lock",
            "../logs/paddlex.log",
            "../logs/paddleocr.log",
            "../logs/ppocr.log",
            "../logs/paddleocr_error.log",
            "../logs/paddleocr_info.log",
            "../logs/paddleocr_warn.log",
            "../logs/faiss.log",

        ]

        # 设置测试环境变量
        self._setup_environment_variables()

        # 初始化日志系统
        setup_logging()

        # 设置测试目录
        self.test_data_dir = Path(__file__).parent / "test_files"
        self.output_data_dir = Path(__file__).parent / "output"
        self.conf_dir = Path(__file__).parent / "configs"
        self.conf_pipeline_dir = Path(__file__).parent / "configs/pipelines"
        # 清空日志文件
        self.clear_log_files()
        # # 检查日志文件是否存在并打印内容
        # self.check_log_files()

    def _setup_environment_variables(self):
        """设置通用环境变量来控制系统行为"""
        # 设置PaddlePaddle日志输出级别
        os.environ.setdefault('GLOG_v', '0')
        os.environ.setdefault('GLOG_logtostderr', '0')
        os.environ.setdefault('GLOG_minloglevel', '2')  # 0=INFO, 1=WARNING, 2=ERROR, 3=FATAL
        os.environ.setdefault('PADDLE_LOG_LEVEL', 'WARNING')
        os.environ.setdefault('FLAGS_print_debug_info', 'false')
        os.environ.setdefault('FLAGS_enable_paddle_debug', 'false')


        # # 是否开启 PaddleX 调试模式
        # if settings.get('app.dev'):
        #     os.environ.setdefault("PADDLE_PDX_DEBUG", "True")
        # else:
        #     os.environ.setdefault("PADDLE_PDX_DEBUG", "False")
        # 设置PaddleX相关环境变量
        # os.environ.setdefault("PADDLE_PDX_DEBUG", "False")  # 是否开启 PaddleX 调试模式
        os.environ.setdefault("PADDLE_PDX_DRY_RUN", "False")  # 是否开启 PaddleX 模型预先运行并缓存下载
        os.environ.setdefault("PADDLE_PDX_EAGER_INIT", "True")  # 是否开启 PaddleX  eager 模式

    def _configure_common_loggers(self, loggers_to_configure=None, noisy_loggers=None):
        """
        配置常用的第三方库日志记录器

        Args:
            loggers_to_configure: 需要配置的日志记录器列表
            noisy_loggers: 需要设置为WARNING级别的日志记录器列表
        """
        # 默认需要配置的日志记录器
        if loggers_to_configure is None:
            loggers_to_configure = [
                'paddlex',
                'paddleocr',
                'paddle',
            ]

        # 默认需要设置为WARNING级别的日志记录器
        if noisy_loggers is None:
            noisy_loggers = [
                'paddle.fluid',
                'paddle.inference',
                'paddle.distributed',
                'paddle.optimizer',
                'paddle.nn',
                'paddle.static',
                'ppdet',
                'ppocr',
            ]

        # 配置常用库的日志记录器
        for logger_name in loggers_to_configure:
            logger = logging.getLogger(logger_name)
            logger.setLevel(logging.INFO)
            if not logger.handlers:
                console_handler = logging.StreamHandler()
                console_handler.setLevel(logging.INFO)
                formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
                console_handler.setFormatter(formatter)
                logger.addHandler(console_handler)
            logger.propagate = False

        # 将可能产生详细日志的库设置为WARNING级别
        for logger_name in noisy_loggers:
            logging.getLogger(logger_name).setLevel(logging.WARNING)

        # 将所有其他库的日志级别设置为WARNING，避免DEBUG信息
        for name in logging.Logger.manager.loggerDict.keys():
            logger = logging.getLogger(name)
            if logger.level == logging.NOTSET:
                logger.setLevel(logging.WARNING)

    def clear_log_files(self):
        """清空日志目录下的所有日志文件"""

        for log_file in self.log_files:
            if os.path.exists(log_file):
                try:
                    open(log_file, 'w').close()  # 清空文件内容
                    # print(f"已清空日志文件: {log_file}")
                except Exception as e:
                    # print(f"清空日志文件 {log_file} 失败: {e}")
                    pass

    def check_log_files(self):
        """检查日志文件是否存在并打印内容"""
        for log_file in self.log_files:
            if os.path.exists(log_file):
                print(f"\n=== {log_file} 内容 ===")
                try:
                    with open(log_file, 'r', encoding='utf-8') as f:
                        lines = f.readlines()
                        if lines:
                            # 只显示最后几行
                            for line in lines[-20:]:  # 显示最后20行
                                print(line.strip())
                        else:
                            print("文件为空")
                except Exception as e:
                    print(f"读取文件出错: {e}")
            else:
                print(f"\n日志文件 {log_file} 不存在")

    def get_logger(self, name=None):
        """获取日志记录器"""
        return app_get_logger(name)

    def get_log_stats(self):
        """获取日志统计信息"""
        return _logger_manager.get_log_stats()


base_test_case = BaseTestCase()
